# # 列表是有序可变的
# # 操作列表，一般包含增加数据，删除数据，修改数据以及查询数据
# # 增删改查

# heros1 = ['蜘蛛侠', '钢铁侠', '闪电侠', '青蜂侠', '超人', '蝙蝠侠']
# # 1.增加元素----append,insert,extend
# # append()——在列表的最后边追加一个元素
# heros1.append('灭霸')
# print(heros1)
# # insert()--insert(self,index,object)--往指定位置加入元素
# # index表示下标，也就是要插入的位置。object表示对象，具体插入哪个数据
# heros1.insert(1, '星爵')
# print(heros1)
# # extend()--需要一个可迭代对象，将两个对象合起来
# # A.extend(B)==》将可迭代对象B添加到A里
# heros2 = ['玉皇大帝', '卢来佛祖', 'theshy']
# heros1.extend(heros2)
# print(heros1)



# NPC1 = ['蜘蛛侠', '钢铁侠', '闪电侠', '青蜂侠', '超人', '蝙蝠侠', '青蜂侠', '土豆侠']
# # 2.删除数据---pop(),remove(),clear()
# # pop(index)--会删除列表里最后一个数据，类似于数据结构里的出栈,删除这个数据并返回这个数据
# # 也可以用来删除指定位置的元素
# print(NPC1.pop())  # 土豆侠
# print(NPC1)  # ['蜘蛛侠', '钢铁侠', '闪电侠', '青蜂侠', '超人', '蝙蝠侠', '青蜂侠']
# NPC1.pop(0)
# print(NPC1)  # ['钢铁侠', '闪电侠', '青蜂侠', '超人', '蝙蝠侠', '青蜂侠']

# # remove()--删除指定元素,如果删除的元素不存在就会报错
# NPC1.remove('闪电侠')
# print(NPC1)  # ['钢铁侠', '青蜂侠', '超人', '蝙蝠侠', '青蜂侠']

# # del 方法也可以删除数据，但是尽量不要用这个方法,不推荐这个方法
# del NPC1[2]
# print(NPC1)  # ['钢铁侠', '青蜂侠', '蝙蝠侠', '青蜂侠']

# # clear()---清空一个列表,留下一个空的
# NPC1.clear()
# print(NPC1)  # []


# # 3。查询相关的方法
# NPC2 = ['盖伦', '赵信', '剑圣', '哈撒给', '卡沙', '狮子狗']
# print(NPC2.index('剑圣'))             # 2
# # print(NPC2.index('寒冰'))           # 如果元素不存在，就会报错
# print(NPC2.count('哈撒给'))            # 1--出现了一次
# print('卡沙' in NPC2)                   # True
# print('小驴人' in NPC2)                  # False

# # 4.修改元素
# # c
# NPC2[3] = '托儿索'
# print(NPC2)    


# # 列表的遍历

# # 遍历——将所有的数据都访问一遍，针对的是可迭代对象
# # while循环遍历，for...in 循环遍历
# NPC3 = ['大树', '克列', '加里奥', '诺手', '蛮子', '杰斯', '豹女']

# # for in 方法就是不断的调用next()方法 来查找下一个数据
# for hanhan in NPC3:
#     print(hanhan)

# print('//')

# # while
# i = 0
# while i < len(NPC3):
#     print(NPC3[i])
#     i += 1
    

# # 列表的复制
# x = [100, 200, 300]
# y = x  # x和y指向了同一个内存空间，会相互影响，等号是内存地址的赋值

# # 调用copy方法，可以复制一个列表
# # 这个新列表和原有的列表内容一样，但是指向不同的内存空间
# z = x.copy()
# print('z', z)  # z [100, 200, 300]

# x[0] = 1
# print('y', y)  # y [1, 200, 300]
# print('x', x)  # x [1, 200, 300]
# # 调用copy方法，可以复制一个列表
# # 这个新列表和原有的列表内容一样，但是指向不同的内存空间

# # 也就是说，我们想把x列表的内容给y,但是又不想y的内容受到后续x的影响，就使用copy()方法
# # 也就是只把当前x的值给y,至于后来x怎么变化对y没有影响

# # 除了使用列表自带的copy方法意外，还可以使用copy模块实现拷贝

# import copy  # 报错，TypeError: copy() missing 1 required positional argument: 'x'

# # a1 = copy.copy()  # 效果等价于x.copy(),都是一个浅拷贝
# a2 = x.copy()
# # print(a1)
# print('a2', a2)  # a2 [1, 200, 300]

# # 切片其实就是一个浅拷贝
# name1 = ['zhangsan', 'lisi', 'wangwu']
# name2 = name1[::]
# print(name1, name2)         # ['zhangsan', 'lisi', 'wangwu'] ['zhangsan', 'lisi', 'wangwu']
# name1[0] = 'Tom'
# print(name2)        #['zhangsan', 'lisi', 'wangwu']

# # 那什么是浅拷贝什么是深拷贝
# #　浅拷贝我们理解为浅层次的拷贝，就是我拷过来就完了，至于后边怎么变，与我无关
# #  深拷贝正好与浅拷贝相反，你只要吃了我的，以后一辈子都欠我的，一辈子受影响

# words = ['hello', 'good', 'are you ok', '','' , 'ao li gei', '']
# # 在使用for  in循环遍历列表时，最好不要对元素进行增删操作
# for word in words:
#     i=0
#     while i <len(words):
#         if words[i] == '':
#             words.remove(words[i])
#         i+=1
# print(words)                  # 会存在有的列表被漏删的问题

# word2=[]
# for each in words:
#     if each!='':
#         word2.append(each)
# print(word2)

# import random

# # 列表的嵌套
# # nums = [1,2,[12,23],56,7,[5]]
# # 有一个学校，有3个办公室，现在有8位老师等待工位分配，请编写程序，完成随机的分配
# teachers = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
# rooms = [[], [], []]
# for _each in teachers:
#     room=random.choice(rooms)
#     room.append(_each)
# print(rooms)

# import random

# # 列表的嵌套
# # nums = [1,2,[12,23],56,7,[5]]
# # 有一个学校，有3个办公室，现在有8位老师等待工位分配，请编写程序，完成随机的分配
# teachers = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
# rooms = [[], [], []]

# for teacher in teachers:
#     room = random.choice(rooms)  # choice 从列表里随机选择一个数据
#     room.append(teacher)

# print(rooms)

# for i, room in enumerate(rooms):
#     print('房间%d里一共有%d个老师,分别是:' % (i, len(room)), end='')
#     for teacher in room:
#         print(teacher, end='\t')
#     print()
    
# # [['f'], ['a', 'c', 'e', 'g', 'h'], ['b', 'd']]
# # 房间0里一共有1个老师,分别是f	
# # 房间1里一共有5个老师,分别是a	c	e	g	h	
# # 房间2里一共有2个老师,分别是b	d	

#  列表推导式的使用

# 列表推导式作用是使用简单的语法创建一个列表
# nums = [i for i in range(10)]
# print(nums)                 # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

# nums = []
# for i in range(10):
#     nums.append(i)
# print(nums)                 # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

# 打印9以内所有的偶数
# x = [i for i in range(10) if i % 2 == 0]
# print(x)                # [0, 2, 4, 6, 8]

# 打印9以内的所有奇数--因为i%2是偶数的时候是0，其他的情况都是1，i在10以内，并且i不能魔于2的情况就是奇数
# x = [i for i in range(10) if i % 2]
# print(x)                # [1, 3, 5, 7, 9]

# 其实就相当于直角坐标系里的坐标，横坐标有一个范围，纵坐标有一个范围，在坐标系里是一个矩形
# point是一个列表，这个列表里的元素都是元组
# points = [(x, y) for x in range(5, 9) for y in range(10, 20)]
# print(points)
# # 　[(5, 10), (5, 11), (5, 12), (5, 13), (5, 14), (5, 15), (5, 16), (5, 17), (5, 18), (5, 19), (6, 10), (6, 11), (6, 12), (6, 13), (6, 14), (6, 15), 。。。。。。。。。。

# # P89 列表推导式的练习

# # 请写出一段python代码实现分组一个list里边的元素，比如[1,2,3,4,5,6,.....100]变成[1,2,3][4,5,6][7,8,9]....
# m = [i for i in range(1, 101)]
# print(m)
# # 实际上相当于一个切片的操作
# # m[0,3]   j     0
# # m[3,6]   j     3
# # m[6,9]   j     6
# n = [m[j:j + 3] for j in range(0, 100 ,3)]
# print(n)        #[[1, 2, 3], [2, 3, 4], [3, 4, 5], [4, 5, 6], [5, 6, 7], [6, 7, 8], [7, 8, 9], [8, 9, 10], [9, 10, 11], [10, 11, 12],

m=[m for m in range(0,101)]
n=[m[j:j+3]  for j in range(0,100,3)]
print(n)